package label_center

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
	"time"

	"github.com/qida/gohp/timex"
)

// 订阅表，状态
const (
	StatusBaseSubscribe删除     = -10
	StatusBaseSubscribe停用     = -1
	StatusBaseSubscribe新创建未发送 = 10
	StatusBaseSubscribe已发送未完成 = 20
	StatusBaseSubscribe已完成    = 30

	TypeSubscribe历史订阅 = 1
	TypeSubscribe实时订阅 = 2
	TypeSubscribe音频订阅 = 3
)

// 订阅任务记录

// 订阅 创建 请求
type ReqCreateBaseSubscribe struct {
	AppId string `json:"AppId"` // 应用Id 默认=rtp

	IdSubscribeTmpl int64  `json:"IdSubscribeTmpl"` // 模板ID
	SubscribeName   string `json:"SubscribeName"`   // 订阅名称
	TypeSubscribe   int8   `json:"TypeSubscribe"`   // 是否为历史调阅 历史=1 实时=2

	DeviceIds  []string `json:"DeviceIds"`  // 国标Id集
	DeviceNvrs []string `json:"DeviceNvrs"` // 国标Id集

	// IdRecSchemes     []string `json:"IdRecSchemes"`     //方案参数Id
	IdSchemes        []int  `json:"IdSchemes"`        // 方案Id
	UserDefinedEqual string `json:"UserDefinedEqual"` // 用户自定义

	DateStart  timex.ODate `json:"DateStart"`  // 开始日期
	DateEnd    timex.ODate `json:"DateEnd"`    // 结束日期
	ImageRate  int         `json:"ImageRate"`  // 抽图频率，每张毫秒数
	TimeRanges []TimeRange `json:"TimeRanges"` // 订阅时间分段
}

// 订阅 批量创建 实时请求 临时
type ReqBaseSubscribeCreateBatch struct {
	DeviceIds []string `json:"DeviceIds"` // 国标Id集
	IdSchemes []int    `json:"IdSchemes"` // 方案Id

	DateStart  timex.ODate `json:"DateStart"`  // 开始日期
	DateEnd    timex.ODate `json:"DateEnd"`    // 结束日期
	ImageRate  int         `json:"ImageRate"`  // 抽图频率，每张毫秒数
	TimeRanges []TimeRange `json:"TimeRanges"` // 订阅时间分段
}

// 时间段
type TimeRange struct {
	TimeStart timex.OTime `json:"TimeStart"` // 1天中开始时间 {
	TimeEnd   timex.OTime `json:"TimeEnd"`   // 1天中结束时间 }
}

type TimeRanges []TimeRange

func (o *TimeRanges) Scan(value interface{}) error {
	b, ok := value.([]byte)
	if !ok {
		return errors.New("failed to unmarshal TimeRange value")
	}
	var config []TimeRange
	err := json.Unmarshal(b, &config)
	if err != nil {
		return err
	}
	*o = config
	return nil
}

func (o TimeRange) Value() (driver.Value, error) {
	return json.Marshal(o)
}

func (o *TimeRange) Scan(value interface{}) error {
	b, ok := value.([]byte)
	if !ok {
		return errors.New("failed to unmarshal TimeRange value")
	}
	var config TimeRange
	err := json.Unmarshal(b, &config)
	if err != nil {
		return err
	}
	*o = config
	return nil
}

func (o TimeRanges) Value() (driver.Value, error) {
	return json.Marshal(o)
}

// 订阅 删除 请求
type ReqDeleteBaseSubscribe struct {
	IdSubscribe int64 `json:"IdSubscribe"` // 订阅Id
}

// 订阅 修改 请求
type ReqUpdateBaseSubscribe struct {
	IdSubscribe     int64  `json:"IdSubscribe"`     // 订阅Id
	IdSubscribeTmpl int64  `json:"IdSubscribeTmpl"` // 模板ID
	SubscribeName   string `json:"SubscribeName"`   // 订阅名称
	TypeSubscribe   int8   `json:"TypeSubscribe"`   // 是否为历史调阅 历史=1 实时=2

	DeviceNvrs []string `json:"DeviceNvrs"` // 设备NVR列表
	DeviceIds  []string `json:"DeviceIds"`  // 国标Id集

	IdSchemes []int `json:"IdSchemes"` // 方案Id
	// IdRecSchemes     []string `json:"IdRecSchemes"`     //方案参数Id
	UserDefinedEqual string `json:"UserDefinedEqual"` // 用户自定义

	DateStart timex.ODate `json:"DateStart"` // 开始日期 2006-01-02
	DateEnd   timex.ODate `json:"DateEnd"`   // 结束日期 2006-01-02

	ImageRate  int         `json:"ImageRate"`  // 抽图频率，每张毫秒数
	TimeRanges []TimeRange `json:"TimeRanges"` // 订阅时间分段

	Status int8 `json:"Status"` // 状态 正常=10 禁用=-1
}

// 订阅 查询 请求
type ReqSearchBaseSubscribe struct {
	AppId string `json:"AppId"` // 应用Id 默认=rtp

	KeyWord         string `json:"KeyWord,omitempty"`     // 全局关键词
	DeviceId        string `json:"DeviceId,omitempty"`    // 设备Id
	DeviceNvr       string `json:"DeviceNvr,omitempty"`   // 设备NVR
	IdSubscribe     int64  `json:"IdSubscribe,omitempty"` // 订阅Id
	IdSubscribeTmpl int64  `json:"IdSubscribeTmpl"`       // 模板ID

	IdScheme int `json:"IdScheme,omitempty"` // 方案Id
	// IdRecScheme      string `json:"IdRecScheme,omitempty"`      //方案参数Id
	UserDefinedEqual string `json:"UserDefinedEqual,omitempty"` // 用户自定义

	SubscribeName string   `json:"SubscribeName,omitempty"` // 订阅名称
	TypeSubscribe int8     `json:"TypeSubscribe,omitempty"` // 订阅类型 1:历史 2:实时
	Status        int8     `json:"Status,omitempty"`        // 状态 正常=10 禁用=-1
	Page          int64    `json:"Page"`                    // 必填 指定返回页码号
	Limit         int64    `json:"Limit"`                   // 必填 指定返回每页条数
	FieldOrders   []string `json:"FieldOrders,omitempty"`   // 指定要排序的字段数组，默认升序，降序加前缀-，如 ["-Id", "Name"] 按Id降序Name升序排列
}

type ReqBaseSubscribeId struct {
	IdSubscribe int64 `json:"IdSubscribe"` // 订阅Id
}

// 订阅 执行抽图 请求
type ReqHistoryBaseSubscribe struct {
	IdSubscribe int64  `json:"IdSubscribe"` // 订阅Id,默认0，所有订阅
	DeviceId    string `json:"DeviceId"`    // 设备编码(国标Id)
}

// 订阅 执行抽图 请求
type ReqRealtimeBaseSubscribe struct {
	DateTimeStart time.Time `json:"DateTimeStart"` //(实时任务选填参数，默认当前时间)任务起点时间,默认是当前时间向后多少秒，配置默认10秒
	SecondLen     int       `json:"SecondLen"`     //(实时任务选填参数，默认以配置文件为准)任务起点向后偏移时长秒
	IdSubscribe   int64     `json:"IdSubscribe"`   // 订阅Id,默认0，所有订阅
}

type RespBaseSubscribe struct {
	AppId string `json:"AppId"` // 应用Id 默认=rtp

	IdSubscribe     int64     `json:"IdSubscribe"`     // 订阅Id
	IdSubscribeTmpl int64     `json:"IdSubscribeTmpl"` // 模板ID
	SubscribeName   string    `json:"SubscribeName"`   // 订阅名称
	TypeSubscribe   int8      `json:"TypeSubscribe"`   // 订阅类型 1:历史 2:实时
	Status          int8      `json:"Status"`          // 状态 正常=10 禁用=-1
	DateStart       time.Time `json:"DateStart"`       // 开始日期
	DateEnd         time.Time `json:"DateEnd"`         // 结束日期
	ImageRate       int       `json:"ImageRate"`       // 抽图频率，每张毫秒数

	DeviceNvrs []string `json:"DeviceNvrs"` // 设备NVR列表
	DeviceIds  []string `json:"DeviceIds"`  // 国标Id集
	// IdRecSchemes     []string    `json:"IdRecSchemes"`     //AI分析方案参数记录Id
	IdSchemes        []int       `json:"IdSchemes"`        // AI分析方案参数记录Id
	UserDefinedEqual string      `json:"UserDefinedEqual"` // 用户自定义
	TimeRanges       []TimeRange `json:"TimeRanges"`       // 订阅时间分段

	TimeCreate time.Time `json:"TimeCreate"` // 记录创建时间
	TimeUpdate time.Time `json:"TimeUpdate"` // 最后修改时间
}

// 响应 查询列表
type RespBaseSubscribes struct {
	Total          int64               `json:"Total"`          // 返回列表的总条数
	BaseSubscribes []RespBaseSubscribe `json:"BaseSubscribes"` // 返回列表对象
}

// 订阅 推流 请求

type ReqBaseSubscribeHistory struct {
	IdSubscribe int64 `json:"IdSubscribe"` // 订阅Id
}
